/*
 * @Author: 别拿暗恋当饭吃. 13466071+lililkli@user.noreply.gitee.com
 * @Date: 2024-06-21 12:00:04
 * @LastEditors: 别拿暗恋当饭吃. 13466071+lililkli@user.noreply.gitee.com
 * @LastEditTime: 2024-06-21 21:25:41
 * @FilePath: \react项目框架\sx_demo2\src\store\dict.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import type {
  ActionReducerMapBuilder,
  // Store,
  AsyncThunk,
  PayloadAction, // SerializedError
} from "@reduxjs/toolkit";

/**
 * 设置加载状态
 * @param state 状态
 * @param action 动作
 * @param loading 加载状态
 */
export const setLoading = (state: any, action: any, loading: boolean) => {
  const arr = action.type.split("/");
  arr.pop();
  state.loading = loading;
};
/**
 * 请求状态
 */
type requestStatus = "pending" | "fulfilled" | "rejected";
/**
 * 自定义载荷
 */
// 定义自定义的Payload类型
type SelfPayload = PayloadAction<
  // 泛型参数，表示action的类型
  any,
  // 表示action的名称
  string,
  // 表示action的参数
  {
    // 参数1
    arg: any;
    // 参数2
    requestId: string;
    // 参数3
    requestStatus: requestStatus;
    // 参数4
    aborted?: boolean;
    // 参数5
    condition?: boolean;
  } & (
    // 参数6
    | {
        // 参数7
        rejectedWithValue?: true;
      }
    // 参数8
    | ({
        // 参数9
        rejectedWithValue?: false;
      } & {
        // 参数10
        //
        error?: any;
      })
  ),
  // 表示action的返回值
  any
>;

/**
 * 添加构建者
 * @param builder 构建者
 * @param fn 异步操作
 * @param callback 回调函数
 */
// 导出一个addBuilder函数，接收三个参数
export const addBuilder = (
  // builder：ActionReducerMapBuilder<any>，用于构建actionReducerMap
  builder: ActionReducerMapBuilder<any>,
  // fn：AsyncThunk<any, any, any>，异步操作的函数
  fn: AsyncThunk<any, any, any>,
  // callback：(state: any, action: SelfPayload) => void = () => {}，回调函数
  callback: (state: any, action: SelfPayload) => void = () => {}
) => {
  // 为builder添加一个case，当fn为pending时，将loading设置为true
  builder
    .addCase(fn.pending, (state, action) => {
      setLoading(state, action, true);
    })
    // 为builder添加一个case，当fn为fulfilled时，将loading设置为false，并调用回调函数
    .addCase(fn.fulfilled, (state, action) => {
      setLoading(state, action, false);
      callback(state, action as any);
    })
    // 为builder添加一个case，当fn为rejected时，将loading设置为false，并调用回调函数
    .addCase(fn.rejected, (state, action) => {
      setLoading(state, action, false);
      callback(state, action);
    });
};